﻿using Autodesk.AutoCAD.DatabaseServices;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CadDotNetTools
{
    public static class GroupTools
    {
        /// <summary>
        /// 创建一个新的组
        /// </summary>
        /// <param name="db">数据库</param>
        /// <param name="groupName">创建的组名</param>
        /// <param name="ids">要加入实体的ObjectId集合</param>
        /// <returns>组的Id</returns>
        public static ObjectId CreateGroup(this Database db, string groupName, ObjectIdCollection ids)
        {
            //打开当前数据库的组字典对象
            var groupDict = db.GroupDictionaryId.GetObject(OpenMode.ForRead) as DBDictionary;
            //如果已经存在指定名称的组,则返回
            if (groupDict.Contains(groupName)) return ObjectId.Null;
            //新建一个组对象
            var group = new Group(groupName, true);
            //切换组字典为写的状态
            groupDict.UpgradeOpen();
            //在组字典中加入新创建的组对象，并指定它的搜索关键字为groupName
            groupDict.SetAt(groupName, group);
            //通知事物处理完成组对象的加入
            db.TransactionManager.AddNewlyCreatedDBObject(group, true);
            //在组对象中加入实体对象
            group.Append(ids);
            //为了安全，将组字典切换成写
            groupDict.DowngradeOpen();
            return group.ObjectId;  // 返回组的Id
        }
        public static void AppendEntityToGroup(this ObjectId groupId, ObjectIdCollection entIds)
        {
            //打开组对象发
            var group = groupId.GetObject(OpenMode.ForRead) as Group;
            //如果不是组对象，则返回
            if (group == null) return;
            //切换组为写状态
            group.UpgradeOpen();
            //在组中添加实体对象
            group.Append(entIds);
            //为了安全，将组切换为读
            group.DowngradeOpen();
        }
        /// <summary>
        /// 获取实体对象所在的组
        /// </summary>
        /// <param name="entId">实体的Id</param>
        /// <returns>实体所在组的ObjectId</returns>
        public static IEnumerable<ObjectId> GetGroups(this ObjectId entId)
        {
            var obj = entId.GetObject(OpenMode.ForRead);  //打开实体
            //获取实体对象所拥有的永久反应器，（组也属性永久反应器之一）
            var ids = obj.GetPersistentReactorIds();
            if (ids != null && ids.Count > 0)
            {
                //对实体的永久反应器进行筛选，只返回组
                var groupIds = from ObjectId id in ids
                                   //获取永久反应器对象
                               let reactor = id.GetObject(OpenMode.ForRead)
                               //筛选条件设置为Group类
                               where reactor is Group
                               select id;
                if (groupIds.Count() > 0) return groupIds;  //如果实体属于组,返回实体所在组的ObjectId
            }
            return null;  //没有组，则返回空值
        }
    }
}
